package com.example.demo.java8;

import java.util.Optional;

/**
 * @ClassName OptionalTest
 * @Description TODO
 * @Author hly
 * @Date 2018\11\29 0029 15:55
 */
public class OptionalTest {
    /**
     * 常用方法：
     Optional.of(T t) : 创建一个 Optional 实例
     Optional.empty() : 创建一个空的 Optional 实例
     Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
     isPresent() : 判断是否包含值
     orElse(T t) : 如果调用对象包含值，返回该值，否则返回t
     orElseGet(Supplier s) :如果调用对象包含值，返回该值，否则返回 s 获取的值
     map(Function f): 如果有值对其处理，并返回处理后的Optional，否则返回 Optional.empty()
     flatMap(Function mapper):与 map 类似，要求返回值必须是Optional

     */

    public void test01(){
        // Optional.of(T t)
        Optional<Employee> of = Optional.of(new Employee());
        System.out.println(of.get());

        // Optional.empty()
        Optional<Employee> empty = Optional.empty();
        System.out.println("\n"+empty);

        // Optional.ofNullable(T t)
        Optional<Employee> ofNullable = Optional.ofNullable(new Employee());
        Optional<Employee> ofNullable2 = Optional.ofNullable(null);
        System.out.println("\n"+ofNullable);
        System.out.println(ofNullable2);
        System.out.println();

        // isPresent()
        if(ofNullable.isPresent()){
            System.out.println(ofNullable.get());
        }

        // orElse(T t)
        Employee orElse = ofNullable.orElse(new Employee(1001,"jack"));
        System.out.println(orElse);

        // orElseGet(Supplier s)
        Employee orElseGet = ofNullable.orElseGet(() -> new Employee());
        System.out.println(orElseGet);
    }

    public void test2(){
//        Optional<Employee> emp = Optional.of(new Employee(1001, "jack", 32, 28000, "1"));
//        // map(Function f)
//        Optional<String> map = emp.map(Employee::getName);
//        System.out.println(map.get());
//
//        // flatMap(Function mapper)
//        Optional<Double> flatMap = emp.flatMap((e) -> Optional.of(e.getSalary()));
//        System.out.println(flatMap.get());
    }

    public static void main(String[] args) {
        OptionalTest test = new OptionalTest();
        test.test01();
    }

}
